package com.learning.demos;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author adolphw
 *
 * ArrayBlockingQueue 是一个基于数组结构的有界阻塞队列，此队列按FIFO（先进先出）原则对元素进行排序
 * LinkedBlockingQueue 是一个基于链表结构的阻塞队列，此队列按按FIFO（先进先出）排序元素，吞吐量通常要高于ArrayBlockingQueue
 * SynchronousQueue 是一个不存储元素的阻塞队列，每个插入操作必须等到另一个线程调用移除操作，否则一直处于阻塞状态
 *
 * 1 队列
 *
 *
 * 2 阻塞队列 当阻塞队列是空时，从队列中获取元素的操作会被阻塞，反之，往队列里添加的操作将会被阻塞
 * 阻塞队列有没有好的一面
 * 海底捞/赌场 生产者消费者 蛋糕房生产消费队列 mq消息中间件的核心思想
 *
 * 不得不阻塞，如何管理
 * 体检
 *
 * 插入   add(e)     offer(e)   put(e)    offer(e,time,unit)
 * 移除   remove(e)   poll(e)     take(e)     poll(time,unit)
 * 检查   element()   peek()      none        none
 *
 *
 */
public class BlockQueueDemo {

    public static void main(String[] args) throws InterruptedException {
//        List list = new ArrayList();
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<String>(3);

        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.offer("c",2L, TimeUnit.SECONDS));

        System.out.println(blockingQueue.element());

        // 先进先出
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());

    }

}
